package storage

import (
	"io"
	"path/filepath"
)

// Storage 定义存储接口，支持本地存储和MinIO等对象存储
type Storage interface {
	// SaveFile 保存文件，返回访问URL
	SaveFile(data io.Reader, filename string, contentType string) (string, error)

	// GetFile 获取文件内容
	GetFile(filename string) (io.ReadCloser, error)

	// DeleteFile 删除文件
	DeleteFile(filename string) error

	// GetFileURL 获取文件访问URL
	GetFileURL(filename string) string

	// FileExists 检查文件是否存在
	FileExists(filename string) (bool, error)
}

// Config 存储配置
type Config struct {
	// 存储类型: "local" 或 "minio"
	Type string

	// 本地存储配置
	LocalBasePath string // 本地存储根目录
	LocalBaseURL  string // 本地访问URL前缀

	// MinIO配置
	MinIOEndpoint   string
	MinIOPort       string
	MinIOAccessKey  string
	MinIOSecretKey  string
	MinioBucketName string
	MinIOUseSSL     bool
}

// NewStorage 根据配置创建存储实例
func NewStorage(config Config) (Storage, error) {
	switch config.Type {
	case "minio":
		// 使用混合存储模式：本地缓存 + MinIO持久化
		return NewHybridStorage(config)
	default:
		return NewLocalStorage(config), nil
	}
}

// GenerateImagePath 生成图片存储路径
func GenerateImagePath(htmlFileName, imageName string) string {
	dirName := filepath.Base(htmlFileName)
	dirName = dirName[:len(dirName)-len(filepath.Ext(dirName))]
	return filepath.Join(dirName, imageName)
}
